로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
3. 파일 이미지필드 | ✅ 저자: 이유정(박사)
설명:
ImageField
: 이미지 업로드를 위한 필드입니다.FileField
: 이미지 외 일반 파일 업로드용 필드입니다.upload_to='...'
: 업로드된 파일이 저장될 경로 (폴더 구조)를 지정합니다.blank=True
,null=True
: 필수 입력이 아님을 의미합니다.
예:
- 사용자가 글을 쓸 때 이미지와 파일을 첨부할 수 있게 됩니다.
- 이미지 파일은
posts/images/
폴더에, - 일반 파일은
posts/files/
폴더에 저장됩니다.
ImageField
는 이미지를 업로드하고 처리하기 위해 Python 이미지 처리 라이브러리인 Pillow가 필요합니다.pip install Pillow
를 반드시 해야 오류 없이 이미지 업로드가 가능합니다.
settings.py
에 MEDIA 설정
MEDIA_URL
: 브라우저에서 파일을 접근할 때 사용할 URL 경로입니다.MEDIA_ROOT
: 실제 파일이 저장될 서버의 경로입니다. (/media
폴더로 생성됨)- 사용자가 업로드한 이미지가
media/posts/images/파일.jpg
에 저장되고, - 웹에서는
http://도메인/media/posts/images/파일.jpg
로 접근 가능해집니다.
urls.py
MEDIA 경로 등록
- 개발 서버에서 업로드된 파일을 브라우저에 보여주기 위해 필요한 설정입니다.
static()
함수를 통해/media/
로 접근하면 실제 파일 경로(MEDIA_ROOT
)에서 찾아줍니다.
모델에 추가한
image
, file
필드도 fields
에 포함시켜야 폼에서 사용자가 업로드할 수 있습니다.
request.POST
는 사용자가<form>
에서 입력한 텍스트 데이터 (예: 제목, 내용 등)를 담고 있습니다.
request.POST = {
'title': '오늘의 일기',
'content': '오늘은 정말 덥다.'
}
request.FILES
는<input type="file">
을 통해 업로드된 파일 데이터 (이미지, 문서 등)를 담고 있습니다.
request.FILES = {
'image': <InMemoryUploadedFile: photo.jpg>,
'file': <InMemoryUploadedFile: sample.pdf>
}
즉, 사용자가 첨부한 이미지/파일은 request.POST
에 들어가지 않습니다.
그래서 폼에서 파일을 받으려면?
form = PostForm(request.POST, request.FILES)
request.POST
: 글 제목, 내용 등 텍스트 필드용request.FILES
: 이미지, 파일 등 파일 필드용
이렇게 둘 다 함께 넘겨야, Django의 ModelForm
이 내부적으로 각 필드에 알맞은 데이터를 넣고 유효성 검사를 할 수 있습니다.
이미지 보여주기
{% if post.image %}
<img src="{{ post.image.url }}" alt="{{ post.title }}">
{% endif %}
사용자가 업로드한 이미지를 웹페이지에 바로 보여주는 기능입니다. 결과예시:
<img src="/media/posts/images/cat.jpg" alt="귀여운 고양이">
파일 다운로드 링크 만들기
{% if post.file %}
<a href="{{ post.file.url }}">파일 다운로드</a>
{% endif %}
예시결과
<a href="/media/posts/files/lecture.pdf">파일 다운로드</a>
사용자가 업로드한 PDF, Word, ZIP 등의 파일을 링크로 제공하고 다운로드할 수 있게 해줍니다.